package servlet;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import model.Content;
import model.Login;
import model.RequestHdr;

import org.json.JSONException;

import util.JdoUtils;

import jp.sourceforge.reflex.IResourceMapper;
import jp.sourceforge.reflex.core.ResourceMapper;

public class ReflexGaeServlet extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {

		resp.setContentType("text/plain");
		resp.setCharacterEncoding("UTF-8");

		// 親
		Login login = new Login();

		// 子要素が１つ場合
		login.requestHdr = new RequestHdr();
		login.requestHdr.clientID = "clientid";
		login.requestHdr.ver = "version";
		login.requestHdr.ver_$title = "xmlns1"; // 属性の指定は必ずStringで

		// 子要素が多重度０，∞で存在する場合
		login.content = new ArrayList<Content>();
		Content id = new Content();
		id.val = "001あ";
		login.content.add(id);
		id = new Content();
		id.val = "002い";
		login.content.add(id);
		id = new Content();
		id.val = "003う";
		login.content.add(id);

		// Reflex独自のfield名変換例（コロンとマイナスの表現）
		// 　　例えば、QNAMEの:は$に、-は__に変換される
		login.minus__fld = " - ⇔ __に変換 ";
		login.colon$fld = " : ⇔ $ ";

		// モデルビーンのパッケージ名（model）を指定してリソースマッパーをnewする
		IResourceMapper mapper = new ResourceMapper("model");

		// そしてXMLにシリアライズ
		String toXML = mapper.toXML(login);
		resp.getWriter().println("\n【JavaBeanからXMLへのシリアライズテスト】:");
		resp.getWriter().println("\nNamespace:");
		resp.getWriter().println(toXML);

		// JSONにシリアライズ 
		String toJSON = mapper.toJSON(login);
		resp.getWriter().println("\n【JSON(0,1)　JSONにシリアライズ】:");
		resp.getWriter().println(toJSON);

	    // JSON デシリアライズテスト
		Login loginnew;
		try {
			loginnew = (Login) mapper.fromJSON(toJSON);
			// XMLにシリアライズ
			toXML = mapper.toXML(loginnew);
			resp.getWriter().println("\n【XMLにシリアライズ】:");
			resp.getWriter().println("\nNamespace:");
			resp.getWriter().println(toXML);
			
		} catch (JSONException e) {
			throw new IOException(e);
		}

	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {

		resp.setContentType("text/plain");
		resp.setCharacterEncoding("UTF-8");

		// モデルビーンのパッケージ名（model）を指定してリソースマッパーをnewする
		IResourceMapper mapper = new ResourceMapper("model");

		resp.getWriter().println(req.getParameter("json"));
		
	    // JSON デシリアライズテスト
		Login loginnew;
		try {
			loginnew = (Login) mapper.fromJSON(req.getParameter("json"));
			// XMLにシリアライズ
			String toXML = mapper.toXML(loginnew);
			resp.getWriter().println("\n【XMLにシリアライズ】:");
			resp.getWriter().println("\nNamespace:");
			resp.getWriter().println(toXML);
			
		} catch (JSONException e) {
			throw new IOException(e);
		}
	    
		// デシリアライズしたものをDatastoreにINSERT
		JdoUtils.insert(loginnew);

		// INSERTしたものを読み取る
		List<Login> entries = JdoUtils.getEntries();

		resp.getWriter().println("\n【DataStoreに格納されているものを全部取り出して表示】");
		
		for (Login aEntry : entries) {

			// XMLにシリアライズ
			String toXML = mapper.toXML(aEntry);
			resp.getWriter().println("\n【XMLにシリアライズ】:");
			resp.getWriter().println("\nNamespace:");
			resp.getWriter().println(toXML);
			
			// XMLからデシリアライズしてみる
			Login loginnew2 = (Login) mapper.fromXML(toXML);
			
			// さらにJSONにシリアライズ 
			String toJSON = mapper.toJSON(loginnew2);
			resp.getWriter().println("\n【XMLをデシリアライズしてさらにJSONにシリアライズ】:");
			resp.getWriter().println(toJSON);
			
		}
	}

	
	
}
